ebola_2014_2016_clean <- read.csv("D:/desktop/R COde/ebola/ebola_2014_2016_clean.csv")
View(ebola_2014_2016_clean)
Basic data cleaing
Seprating the original Date column into month , date and year columns.
Ebola<-ebola_2014_2016_clean
library(dplyr)
library(tidyr)
Ebola<-Ebola %>% separate(Date, c("Month", "Date","Year"))
Ebola <- Ebola[,-c(6,10)]
head(Ebola)
Arranging the dataset with respect to the countries.
Ebola%>% arrange(Country)
Changing the column names.
colnames(Ebola)[5:10]<- c("suspected.cases","confirmed.cases","total.cases","suspected.deaths","confirmed.deaths","total.deaths")
colnames(Ebola)
[1] "Country" "Month" "Date" "Year" "suspected.cases" "confirmed.cases" "total.cases"
[8] "suspected.deaths" "confirmed.deaths" "total.deaths"
Creating a list of all the countries that got affected from the outbreak
country_list<-c(distinct(Ebola,Country))
country_list
$Country
[1] Guinea Nigeria Sierra Leone Liberia Senegal USA Spain Mali United Kingdom
[10] Italy
Levels: Guinea Italy Liberia Mali Nigeria Senegal Sierra Leone Spain United Kingdom USA
Creating total cases vs total deaths plot for each country
1) Calculating total cases and deaths in Guinea
r1 <-Ebola%>% select(total.deaths,Country,Year) %>% filter(Country == "Guinea", Year==2014)
r2 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Guinea", Year==2015)
r3 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Guinea", Year==2016)
deaths_2014_Guinea <- sapply(select(r1,total.deaths),na.rm=T,max)
deaths_2015_Guinea<- sapply(select(r2,total.deaths),na.rm=T,max)-sapply(select(r1,total.deaths),na.rm=T,max)
deaths_2016_Guinea <- sapply(select(r3,total.deaths),na.rm=T,max)-sapply(select(r2,total.deaths),na.rm=T,max)
s1 <-Ebola%>% select(total.cases,Country,Year) %>% filter(Country == "Guinea", Year==2014)
s2 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Guinea", Year==2015)
s3 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Guinea", Year==2016)
cases_2014_Guinea <- sapply(select(s1,total.cases),na.rm=T,max)
cases_2015_Guinea<- sapply(select(s2,total.cases),na.rm=T,max)-sapply(select(s1,total.cases),na.rm=T,max)
cases_2016_Guinea <- sapply(select(s3,total.cases),na.rm=T,max)-sapply(select(s2,total.cases),na.rm=T,max)
2)Calculating total cases and deaths in Nigeria
r4 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Nigeria", Year==2014)
r5 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Nigeria", Year==2015)
r6 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Nigeria", Year==2016)
deaths_2014_Nigeria <- sapply(select(r4,total.deaths),na.rm=T,max)
deaths_2015_Nigeria<- sapply(select(r5,total.deaths),na.rm=T,max)-sapply(select(r4,total.deaths),na.rm=T,max)
deaths_2016_Nigeria <- sapply(select(r6,total.deaths),na.rm=T,max)-sapply(select(r5,total.deaths),na.rm=T,max)
s4 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Nigeria", Year==2014)
s5 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Nigeria", Year==2015)
s6 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Nigeria", Year==2016)
cases_2014_Nigeria <- sapply(select(s4,total.cases),na.rm=T,max)
cases_2015_Nigeria<- sapply(select(s5,total.cases),na.rm=T,max)-sapply(select(s4,total.cases),na.rm=T,max)
cases_2016_Nigeria <- sapply(select(s6,total.cases),na.rm=T,max)-sapply(select(s5,total.cases),na.rm=T,max)
3)Calculating total cases and deaths in Sierra
r7 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Sierra Leone", Year==2014)
r8 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Sierra Leone", Year==2015)
r9 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Sierra Leone", Year==2016)
deaths_2014_Sierra <- sapply(select(r7,total.deaths),na.rm=T,max)
deaths_2015_Sierra<- sapply(select(r8,total.deaths),na.rm=T,max)-sapply(select(r7,total.deaths),na.rm=T,max)
deaths_2016_Sierra <- sapply(select(r9,total.deaths),na.rm=T,max)-sapply(select(r8,total.deaths),na.rm=T,max)
s7 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Sierra Leone", Year==2014)
s8 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Sierra Leone", Year==2015)
s9 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Sierra Leone", Year==2016)
cases_2014_Sierra <- sapply(select(s7,total.cases),na.rm=T,max)
cases_2015_Sierra<- sapply(select(s8,total.cases),na.rm=T,max)-sapply(select(s7,total.cases),na.rm=T,max)
cases_2016_Sierra <- sapply(select(s9,total.cases),na.rm=T,max)-sapply(select(s8,total.cases),na.rm=T,max)
4)Calculating total cases and deaths in Liberia
r10 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Liberia", Year==2014)
r11 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Liberia", Year==2015)
r12 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Liberia", Year==2016)
deaths_2014_Liberia <- sapply(select(r10,total.deaths),na.rm=T,max)
deaths_2015_Liberia<- sapply(select(r11,total.deaths),na.rm=T,max)-sapply(select(r10,total.deaths),na.rm=T,max)
deaths_2016_Liberia <- sapply(select(r12,total.deaths),na.rm=T,max)-sapply(select(r11,total.deaths),na.rm=T,max)
s10 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Liberia", Year==2014)
s11 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Liberia", Year==2015)
s12 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Liberia", Year==2016)
cases_2014_Liberia <- sapply(select(s10,total.cases),na.rm=T,max)
cases_2015_Liberia<- sapply(select(s11,total.cases),na.rm=T,max)-sapply(select(s10,total.cases),na.rm=T,max)
cases_2016_Liberia <- sapply(select(s12,total.cases),na.rm=T,max)-sapply(select(s11,total.cases),na.rm=T,max)
5)Calculating total cases and deaths in Senegal
r13 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Senegal", Year==2014)
r14 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Senegal", Year==2015)
r15 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Senegal", Year==2016)
deaths_2014_Senegal <- sapply(select(r13,total.deaths),na.rm=T,max)
deaths_2015_Senegal<- sapply(select(r14,total.deaths),na.rm=T,max)-sapply(select(r13,total.deaths),na.rm=T,max)
deaths_2016_Senegal <- sapply(select(r15,total.deaths),na.rm=T,max)-sapply(select(r14,total.deaths),na.rm=T,max)
s13 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Senegal", Year==2014)
s14 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Senegal", Year==2015)
s15 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Senegal", Year==2016)
cases_2014_Senegal <- sapply(select(s13,total.cases),na.rm=T,max)
cases_2015_Senegal<- sapply(select(s14,total.cases),na.rm=T,max)-sapply(select(s13,total.cases),na.rm=T,max)
cases_2016_Senegal <- sapply(select(s15,total.cases),na.rm=T,max)-sapply(select(s14,total.cases),na.rm=T,max)
6)Calculating total cases and deaths in USA
r16 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "USA", Year==2014)
r17 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "USA", Year==2015)
r18 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "USA", Year==2016)
deaths_2014_USA<- sapply(select(r16,total.deaths),na.rm=T,max)
deaths_2015_USA<- sapply(select(r17,total.deaths),na.rm=T,max)-sapply(select(r15,total.deaths),na.rm=T,max)
deaths_2016_USA <- sapply(select(r18,total.deaths),na.rm=T,max)-sapply(select(r17,total.deaths),na.rm=T,max)
s16 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "USA", Year==2014)
s17 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "USA", Year==2015)
s18 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "USA", Year==2016)
cases_2014_USA<- sapply(select(s16,total.cases),na.rm=T,max)
cases_2015_USA<- sapply(select(s17,total.cases),na.rm=T,max)-sapply(select(s15,total.cases),na.rm=T,max)
cases_2016_USA <- sapply(select(s18,total.cases),na.rm=T,max)-sapply(select(s17,total.cases),na.rm=T,max)
7)Calculating total cases and deaths in Spain
r19 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Spain", Year==2014)
r20 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Spain", Year==2015)
r21 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Spain", Year==2016)
deaths_2014_Spain <- sapply(select(r19,total.deaths),na.rm=T,max)
deaths_2015_Spain<- sapply(select(r20,total.deaths),na.rm=T,max)-sapply(select(r19,total.deaths),na.rm=T,max)
deaths_2016_Spain <- sapply(select(r21,total.deaths),na.rm=T,max)-sapply(select(r20,total.deaths),na.rm=T,max)
s19 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Spain", Year==2014)
s20 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Spain", Year==2015)
s21 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Spain", Year==2016)
cases_2014_Spain <- sapply(select(s19,total.cases),na.rm=T,max)
cases_2015_Spain<- sapply(select(s20,total.cases),na.rm=T,max)-sapply(select(s19,total.cases),na.rm=T,max)
cases_2016_Spain <- sapply(select(s21,total.cases),na.rm=T,max)-sapply(select(s20,total.cases),na.rm=T,max)
- calculating total cases and deaths in Mali
r22 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Mali", Year==2014)
r23 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Mali", Year==2015)
r24 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Mali", Year==2016)
deaths_2014_Mali <- sapply(select(r22,total.deaths),na.rm=T,max)
deaths_2015_Mali<- sapply(select(r23,total.deaths),na.rm=T,max)-sapply(select(r22,total.deaths),na.rm=T,max)
deaths_2016_Mali <- sapply(select(r24,total.deaths),na.rm=T,max)-sapply(select(r23,total.deaths),na.rm=T,max)
s22 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Mali", Year==2014)
s23 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Mali", Year==2015)
s24 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Mali", Year==2016)
cases_2014_Mali <- sapply(select(s22,total.cases),na.rm=T,max)
cases_2015_Mali<- sapply(select(s23,total.cases),na.rm=T,max)-sapply(select(s22,total.cases),na.rm=T,max)
cases_2016_Mali <- sapply(select(s24,total.cases),na.rm=T,max)-sapply(select(s23,total.cases),na.rm=T,max)
- calculating total cases and deaths in United kingdom
r25 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "United Kingdom", Year==2014)
r26 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "United Kingdom", Year==2015)
r27 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "United Kingdom", Year==2016)
deaths_2014_UnitedKingdom <- sapply(select(r25,total.deaths),na.rm=T,max)
deaths_2015_UnitedKingdom <- sapply(select(r26,total.deaths),na.rm=T,max)-sapply(select(r25,total.deaths),na.rm=T,max)
deaths_2016_UnitedKingdom <- sapply(select(r26,total.deaths),na.rm=T,max)-sapply(select(r26,total.deaths),na.rm=T,max)
s25 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "United Kingdom", Year==2014)
s26 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "United Kingdom", Year==2015)
s27 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "United Kingdom", Year==2016)
cases_2014_UnitedKingdom <- sapply(select(s25,total.cases),na.rm=T,max)
cases_2015_UnitedKingdom <- sapply(select(s26,total.cases),na.rm=T,max)-sapply(select(s25,total.cases),na.rm=T,max)
cases_2016_UnitedKingdom <- sapply(select(s26,total.cases),na.rm=T,max)-sapply(select(s26,total.cases),na.rm=T,max)
- calculating total cases and deaths in United kingdom
r28 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Italy", Year==2014)
r29 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Italy", Year==2015)
r30 <-Ebola %>% select(total.deaths,Country,Year) %>% filter(Country == "Italy", Year==2016)
deaths_2014_Italy <- sapply(select(r28,total.deaths),na.rm=T,max)
deaths_2015_Italy<- sapply(select(r29,total.deaths),na.rm=T,max)-sapply(select(r28,total.deaths),na.rm=T,max)
deaths_2016_Italy <- sapply(select(r30,total.deaths),na.rm=T,max)-sapply(select(r29,total.deaths),na.rm=T,max)
s28 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Italy", Year==2014)
s29 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Italy", Year==2015)
s30 <-Ebola %>% select(total.cases,Country,Year) %>% filter(Country == "Italy", Year==2016)
cases_2014_Italy <- sapply(select(s28,total.cases),na.rm=T,max)
cases_2015_Italy<- sapply(select(s29,total.cases),na.rm=T,max)-sapply(select(s28,total.cases),na.rm=T,max)
cases_2016_Italy <- sapply(select(s30,total.cases),na.rm=T,max)-sapply(select(s29,total.cases),na.rm=T,max)
Creating a seperate dataframe for deaths in each year
deaths_2014 <- c(deaths_2014_Guinea,deaths_2014_Nigeria,deaths_2014_Sierra,deaths_2014_Liberia,deaths_2014_Senegal,deaths_2014_USA,
deaths_2014_Spain,deaths_2014_Mali,deaths_2014_UnitedKingdom ,deaths_2014_Italy )
deaths_2015 <- c(deaths_2015_Guinea,deaths_2015_Nigeria,deaths_2015_Sierra,deaths_2015_Liberia,deaths_2015_Senegal,deaths_2015_USA,
deaths_2015_Spain,deaths_2015_Mali,deaths_2015_UnitedKingdom ,deaths_2015_Italy )
deaths_2016 <- c(deaths_2016_Guinea,deaths_2016_Nigeria,deaths_2016_Sierra,deaths_2016_Liberia,deaths_2016_Senegal,deaths_2016_USA,
deaths_2016_Spain,deaths_2016_Mali,deaths_2016_UnitedKingdom,deaths_2016_Italy )
death.Ebola <- data.frame(country_list,deaths_2014,deaths_2015,deaths_2016)
death.Ebola <- do.call(data.frame, lapply(death.Ebola, function(x) {replace(x, is.infinite(x) | is.na(x), 0)}))
invalid factor level, NA generated
death.Ebola
Creating a dataframe for cases in each year
cases_2014 <- c(cases_2014_Guinea,cases_2014_Nigeria,cases_2014_Sierra,cases_2014_Liberia,cases_2014_Senegal,cases_2014_USA,cases_2014_Spain,
cases_2014_Mali,cases_2014_UnitedKingdom ,cases_2014_Italy )
cases_2015 <- c(cases_2015_Guinea,cases_2015_Nigeria,cases_2015_Sierra,cases_2015_Liberia,cases_2015_Senegal,cases_2015_USA,cases_2015_Spain,
cases_2015_Mali,cases_2015_UnitedKingdom ,cases_2015_Italy )
cases_2016 <- c(cases_2016_Guinea,cases_2016_Nigeria,cases_2016_Sierra,cases_2016_Liberia,cases_2016_Senegal,cases_2016_USA,cases_2016_Spain,
cases_2016_Mali,cases_2016_UnitedKingdom,cases_2016_Italy )
case.Ebola <- data.frame(country_list,cases_2014,cases_2015,cases_2016)
case.Ebola <- do.call(data.frame, lapply(case.Ebola, function(x) {replace(x, is.infinite(x) | is.na(x), 0)}))
invalid factor level, NA generated
case.Ebola
case.Ebola$cases_2015[case.Ebola$cases_2015 ==-2] <- 0
case.Ebola$cases_2016[case.Ebola$cases_2016 ==-6] <- 0
case.Ebola
NA
NA
Plot for total deaths in year 2014
library(ggplot2)
library(plotly)
pl <- ggplot(death.Ebola, aes(x=Country, y=deaths_2014))
pl2 <- pl+geom_bar(stat = 'identity',fill = '#fc0373', alpha= 0.95)
pl3 <- pl2 + xlab('Country')+ylab('No of deaths in 2014 ')
pl4<- pl3+ggtitle(" Number of deaths in year 2014 due to outbreak of Ebola virus")
print( pl4 )

Plot for total deaths in year 2015
pl <- ggplot(death.Ebola, aes(x=Country, y=deaths_2015))
pl2 <- pl+geom_bar(stat = 'identity',fill = '#a3cc31', alpha= 0.95)
pl3 <- pl2 + xlab('Country')+ylab('No of deaths ')
pl4<- pl3+ggtitle(" Number of deaths in year 2015 due to outbreak of Ebola virus")
print( pl4 )

Plot for total deaths in year 2015
Since, there were no deaths recoreded in 2016, our plot shows nothing.
pl <- ggplot(death.Ebola, aes(x=Country, y=deaths_2016))
pl2 <- pl+geom_bar(stat = 'identity',fill = '#cc314d', alpha= 0.95)
pl3 <- pl2 + xlab('Country')+ylab('No of deaths ')
pl4<- pl3+ggtitle(" Number of deaths in year 2016 due to outbreak of Ebola virus")
gpl<- ggplotly(pl4)
print( gpl )
NULL
Plot for cases in 2014
pl <- ggplot(case.Ebola, aes(x=Country, y=cases_2014))
pl2 <- pl+geom_bar(stat = 'identity',fill='#cc314d',alpha= 0.95)
pl3 <- pl2 + xlab('Country')+ylab('No of Cases ')
pl4<- pl3+ggtitle(" Number of Cases in year 2014 due to outbreak of Ebola virus ")
gpl<- ggplotly(pl4)
print( pl4 )

Plot for cases in 2015
pl <- ggplot(case.Ebola, aes(x=Country, y=cases_2015))
pl2 <- pl+geom_bar(stat = 'identity',fill='#fa02cd',alpha= 0.95)
pl3 <- pl2 + xlab('Country')+ylab('No of Cases ')
pl4<- pl3+ggtitle(" Number of Cases in year 2015 due to outbreak of Ebola virus ")
gpl<- ggplotly(pl4)
print( pl4 )

Plot for cases in 2016
Since, no cases were recorded in 2016, our plot shows nothing
pl <- ggplot(case.Ebola, aes(x=Country, y=cases_2016))
pl2 <- pl+geom_bar(stat = 'identity',fill='#fa02cd',alpha= 0.95)
pl3 <- pl2 + xlab('Country')+ylab('No of Cases ')
pl4<- pl3+ggtitle(" Number of Cases in year 2016 due to outbreak of Ebola virus(2014-2016) ")
gpl<- ggplotly(pl4)
print( pl4 )

Plot for suspected Vs confirmed deaths during the outbreak
library(ggplot2)
library(plotly)
pl <- ggplot(Ebola, aes(x=total.deaths, y=total.cases ))
pl2 <- pl+geom_smooth(model=lm,color="Blue", fill="Red")
Ignoring unknown parameters: model
pl3 <- pl2 + xlab('Total deaths')+ylab("Total cases")+ggtitle("Plot for total cases vs total deaths")
gpl<- ggplotly(pl3)
`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Removed 8 rows containing non-finite values (stat_smooth).
print(pl3)

Plot for total deaths due Ebola virus
library(ggplot2)
library(plotly)
pl <- ggplot(Ebola, aes(y=total.deaths,x= Year))
pl2 <- pl+geom_bar(stat = "identity",color="red")
pl3 <- pl2 + xlab('Year')+ylab("Total deaths")+ggtitle("Plot for total deaths")
gpl<- ggplotly(pl3)
print(gpl)
NULL
Plot for total Cases
library(ggplot2)
library(plotly)
pl <- ggplot(Ebola, aes(y=total.cases,x= Year))
pl2 <- pl+geom_bar(stat = "identity",color="red")
pl3 <- pl2 + xlab('Year')+ylab("Total cases")+ggtitle("Plot for total cases")
gpl<- ggplotly(pl3)
Removed 8 rows containing missing values (position_stack).
print(pl3)

df.2014 <- data.frame(country_list,case.Ebola$cases_2014,death.Ebola$deaths_2014)
df.2014 <- do.call(data.frame, lapply(df.2014, function(x) {replace(x, is.infinite(x) | is.na(x), 0)}))
invalid factor level, NA generated
df.2014
NA
Pie chart for mortality rate in year 2014
death.percentage.2014 = c(sum(df.2014$deaths_2014)/sum(df.2014$cases_2014), (sum(df.2014$cases_2014) - sum(df.2014$deaths_2014))/sum(df.2014$cases_2014))
death.percentage.2014
[1] 0.3911624 0.6088376
library(plotrix)
Group <- c("Death%","Recorved%")
lbls <- paste0(Group, " ", round(death.percentage.2014 / sum(death.percentage.2014) * 100, 1), "%")
pie3D(death.percentage.2014,labels=lbls,explode=0.1,
main="Death Vs Recorverd in 2014 ")

df.2015 <- data.frame(country_list,case.Ebola$cases_2015,death.Ebola$deaths_2015)
df.2015 <- do.call(data.frame, lapply(df.2015, function(x) {replace(x, is.infinite(x) | is.na(x), 0)}))
invalid factor level, NA generated
print(df.2015)
NA
death.percentage.2015 = c(sum(df.2015$deaths_2015)/sum(df.2015$cases_2015), (sum(df.2015$cases_2015) - sum(df.2015$deaths_2015))/sum(df.2015$cases_2015))
print(death.percentage.2015)
[1] 0.4044624 0.5955376
Pie chart for mortality rate in year 2015
library(plotrix)
Group <- c("Death%","Recorved%")
lbls <- paste0(Group, " ", round(death.percentage.2015 / sum(death.percentage.2015) * 100, 1), "%")
pie3D(death.percentage.2015,labels=lbls,explode=0.1,main="Death Vs Recorverd in 2015 ")

df.2016 <- data.frame(country_list,case.Ebola$cases_2016,death.Ebola$deaths_2016)
df.2016 <- do.call(data.frame, lapply(df.2016, function(x) {replace(x, is.infinite(x) | is.na(x), 0)}))
invalid factor level, NA generated
print(df.2016)
death.percentage.2016 = c(sum(df.2016$deaths_2016)/sum(df.2016$cases_2016), (sum(df.2016$cases_2016) - sum(df.2016$deaths_2016))/sum(df.2016$cases_2016))
print(death.percentage.2016)
[1] 0 1
Pie chart for mortality rate in year 2016
library(plotrix)
lbls <- c("Recorved 100%")
pie3D(death.percentage.2016,labels=lbls,main="Death Vs Recorverd in 2016 ")

death.percentage = c(sum(Ebola$total.deaths)/sum(Ebola$total.cases), (sum(Ebola$total.cases) - sum(Ebola$total.deaths))/sum(Ebola$total.cases))
death.percentage
[1] 0.4039933 0.5960067
Pie chart for total mortality rate during the Ebola Outbreak(2014- 2016)
library(plotrix)
Group <- c("Death%","Recorved%")
lbls <- paste0(Group, " ", round(death.percentage / sum(death.percentage) * 100, 1), "%")
pie3D(death.percentage,labels=lbls,explode=0.1,main="Death Vs Recorverd (2014,2015 and 2016) ")

LS0tDQp0aXRsZTogIkVib2xhIG91dGJyZWFrIDIwMTQtIDIwMTYiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmVib2xhXzIwMTRfMjAxNl9jbGVhbiA8LSByZWFkLmNzdigiRDovZGVza3RvcC9SIENPZGUvZWJvbGEvZWJvbGFfMjAxNF8yMDE2X2NsZWFuLmNzdiIpDQoNClZpZXcoZWJvbGFfMjAxNF8yMDE2X2NsZWFuKQ0KYGBgDQo8Zm9udCBzaXplPSI1Ij4gQmFzaWMgZGF0YSBjbGVhaW5nIDwvZm9udD4NCg0KDQo8Zm9udCBzaXplID0gIjIiPiBTZXByYXRpbmcgdGhlIG9yaWdpbmFsIERhdGUgY29sdW1uIGludG8gbW9udGggLCBkYXRlIGFuZCB5ZWFyIGNvbHVtbnMuDQpgYGB7cn0NCkVib2xhPC1lYm9sYV8yMDE0XzIwMTZfY2xlYW4NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KRWJvbGE8LUVib2xhICU+JSBzZXBhcmF0ZShEYXRlLCBjKCJNb250aCIsICJEYXRlIiwiWWVhciIpKQ0KRWJvbGEgPC0gRWJvbGFbLC1jKDYsMTApXQ0KDQpoZWFkKEVib2xhKQ0KYGBgDQpBcnJhbmdpbmcgdGhlIGRhdGFzZXQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb3VudHJpZXMuDQpgYGB7cn0NCkVib2xhJT4lIGFycmFuZ2UoQ291bnRyeSkNCmBgYA0KQ2hhbmdpbmcgdGhlIGNvbHVtbiBuYW1lcy4NCmBgYHtyfQ0KY29sbmFtZXMoRWJvbGEpWzU6MTBdPC0gYygic3VzcGVjdGVkLmNhc2VzIiwiY29uZmlybWVkLmNhc2VzIiwidG90YWwuY2FzZXMiLCJzdXNwZWN0ZWQuZGVhdGhzIiwiY29uZmlybWVkLmRlYXRocyIsInRvdGFsLmRlYXRocyIpDQoNCmNvbG5hbWVzKEVib2xhKQ0KYGBgDQpDcmVhdGluZyBhIGxpc3Qgb2YgYWxsIHRoZSBjb3VudHJpZXMgdGhhdCBnb3QgYWZmZWN0ZWQgZnJvbSB0aGUgb3V0YnJlYWsgPC9mb250Pg0KYGBge3J9DQpjb3VudHJ5X2xpc3Q8LWMoZGlzdGluY3QoRWJvbGEsQ291bnRyeSkpDQoNCmNvdW50cnlfbGlzdA0KYGBgDQo8Zm9udCBzaXplPSI1Ij4gQ3JlYXRpbmcgdG90YWwgY2FzZXMgdnMgdG90YWwgZGVhdGhzIHBsb3QgZm9yIGVhY2ggY291bnRyeTwvZm9udD4NCg0KPGZvbnQgc2l6ZSA9IjMiPjEpIENhbGN1bGF0aW5nIHRvdGFsIGNhc2VzIGFuZCBkZWF0aHMgaW4gR3VpbmVhDQpgYGB7cn0NCnIxIDwtRWJvbGElPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiR3VpbmVhIiwgWWVhcj09MjAxNCkgDQpyMiA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJHdWluZWEiLCBZZWFyPT0yMDE1KSANCnIzIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkd1aW5lYSIsIFllYXI9PTIwMTYpIA0KDQpkZWF0aHNfMjAxNF9HdWluZWEgPC0gc2FwcGx5KHNlbGVjdChyMSx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KZGVhdGhzXzIwMTVfR3VpbmVhPC0gc2FwcGx5KHNlbGVjdChyMix0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHIxLHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQpkZWF0aHNfMjAxNl9HdWluZWEgPC0gc2FwcGx5KHNlbGVjdChyMyx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHIyLHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQoNCg0KczEgPC1FYm9sYSU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkd1aW5lYSIsIFllYXI9PTIwMTQpIA0KczIgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJHdWluZWEiLCBZZWFyPT0yMDE1KSANCnMzIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiR3VpbmVhIiwgWWVhcj09MjAxNikgDQoNCmNhc2VzXzIwMTRfR3VpbmVhIDwtIHNhcHBseShzZWxlY3QoczEsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNV9HdWluZWE8LSBzYXBwbHkoc2VsZWN0KHMyLHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChzMSx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE2X0d1aW5lYSA8LSBzYXBwbHkoc2VsZWN0KHMzLHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChzMix0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpgYGANCjIpQ2FsY3VsYXRpbmcgdG90YWwgY2FzZXMgYW5kIGRlYXRocyBpbiBOaWdlcmlhDQpgYGB7cn0NCnI0IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIk5pZ2VyaWEiLCBZZWFyPT0yMDE0KSANCnI1IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIk5pZ2VyaWEiLCBZZWFyPT0yMDE1KSANCnI2IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIk5pZ2VyaWEiLCBZZWFyPT0yMDE2KSANCg0KZGVhdGhzXzIwMTRfTmlnZXJpYSA8LSBzYXBwbHkoc2VsZWN0KHI0LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQpkZWF0aHNfMjAxNV9OaWdlcmlhPC0gc2FwcGx5KHNlbGVjdChyNSx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHI0LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQpkZWF0aHNfMjAxNl9OaWdlcmlhIDwtIHNhcHBseShzZWxlY3QocjYsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyNSx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KDQoNCnM0IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiTmlnZXJpYSIsIFllYXI9PTIwMTQpIA0KczUgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJOaWdlcmlhIiwgWWVhcj09MjAxNSkgDQpzNiA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIk5pZ2VyaWEiLCBZZWFyPT0yMDE2KSANCg0KY2FzZXNfMjAxNF9OaWdlcmlhIDwtIHNhcHBseShzZWxlY3QoczQsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNV9OaWdlcmlhPC0gc2FwcGx5KHNlbGVjdChzNSx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QoczQsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNl9OaWdlcmlhIDwtIHNhcHBseShzZWxlY3QoczYsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHM1LHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCkNCg0KYGBgDQozKUNhbGN1bGF0aW5nIHRvdGFsIGNhc2VzIGFuZCBkZWF0aHMgaW4gU2llcnJhDQpgYGB7cn0NCnI3IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNpZXJyYSBMZW9uZSIsIFllYXI9PTIwMTQpIA0KcjggPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiU2llcnJhIExlb25lIiwgWWVhcj09MjAxNSkgDQpyOSA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJTaWVycmEgTGVvbmUiLCBZZWFyPT0yMDE2KSANCg0KZGVhdGhzXzIwMTRfU2llcnJhIDwtIHNhcHBseShzZWxlY3QocjcsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCmRlYXRoc18yMDE1X1NpZXJyYTwtIHNhcHBseShzZWxlY3QocjgsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyNyx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KZGVhdGhzXzIwMTZfU2llcnJhIDwtIHNhcHBseShzZWxlY3QocjksdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyOCx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KDQpzNyA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNpZXJyYSBMZW9uZSIsIFllYXI9PTIwMTQpIA0KczggPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJTaWVycmEgTGVvbmUiLCBZZWFyPT0yMDE1KSANCnM5IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiU2llcnJhIExlb25lIiwgWWVhcj09MjAxNikgDQoNCmNhc2VzXzIwMTRfU2llcnJhIDwtIHNhcHBseShzZWxlY3QoczcsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNV9TaWVycmE8LSBzYXBwbHkoc2VsZWN0KHM4LHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChzNyx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE2X1NpZXJyYSA8LSBzYXBwbHkoc2VsZWN0KHM5LHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChzOCx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQoNCmBgYA0KNClDYWxjdWxhdGluZyB0b3RhbCBjYXNlcyBhbmQgZGVhdGhzIGluIExpYmVyaWENCmBgYHtyfQ0KcjEwIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkxpYmVyaWEiLCBZZWFyPT0yMDE0KSANCnIxMSA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJMaWJlcmlhIiwgWWVhcj09MjAxNSkgDQpyMTIgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiTGliZXJpYSIsIFllYXI9PTIwMTYpIA0KDQpkZWF0aHNfMjAxNF9MaWJlcmlhIDwtIHNhcHBseShzZWxlY3QocjEwLHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQpkZWF0aHNfMjAxNV9MaWJlcmlhPC0gc2FwcGx5KHNlbGVjdChyMTEsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyMTAsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCmRlYXRoc18yMDE2X0xpYmVyaWEgPC0gc2FwcGx5KHNlbGVjdChyMTIsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyMTEsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCg0KDQpzMTAgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJMaWJlcmlhIiwgWWVhcj09MjAxNCkgDQpzMTEgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJMaWJlcmlhIiwgWWVhcj09MjAxNSkgDQpzMTIgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJMaWJlcmlhIiwgWWVhcj09MjAxNikgDQoNCmNhc2VzXzIwMTRfTGliZXJpYSA8LSBzYXBwbHkoc2VsZWN0KHMxMCx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE1X0xpYmVyaWE8LSBzYXBwbHkoc2VsZWN0KHMxMSx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QoczEwLHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCkNCmNhc2VzXzIwMTZfTGliZXJpYSA8LSBzYXBwbHkoc2VsZWN0KHMxMix0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QoczExLHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCkNCmBgYA0KNSlDYWxjdWxhdGluZyB0b3RhbCBjYXNlcyBhbmQgZGVhdGhzIGluIFNlbmVnYWwNCmBgYHtyfQ0KcjEzIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNlbmVnYWwiLCBZZWFyPT0yMDE0KSANCnIxNCA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJTZW5lZ2FsIiwgWWVhcj09MjAxNSkgDQpyMTUgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiU2VuZWdhbCIsIFllYXI9PTIwMTYpDQoNCmRlYXRoc18yMDE0X1NlbmVnYWwgPC0gc2FwcGx5KHNlbGVjdChyMTMsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCmRlYXRoc18yMDE1X1NlbmVnYWw8LSBzYXBwbHkoc2VsZWN0KHIxNCx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHIxMyx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KZGVhdGhzXzIwMTZfU2VuZWdhbCA8LSBzYXBwbHkoc2VsZWN0KHIxNSx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHIxNCx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KDQoNCnMxMyA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNlbmVnYWwiLCBZZWFyPT0yMDE0KSANCnMxNCA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNlbmVnYWwiLCBZZWFyPT0yMDE1KSANCnMxNSA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNlbmVnYWwiLCBZZWFyPT0yMDE2KQ0KDQpjYXNlc18yMDE0X1NlbmVnYWwgPC0gc2FwcGx5KHNlbGVjdChzMTMsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNV9TZW5lZ2FsPC0gc2FwcGx5KHNlbGVjdChzMTQsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMxMyx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE2X1NlbmVnYWwgPC0gc2FwcGx5KHNlbGVjdChzMTUsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMxNCx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpgYGANCjYpQ2FsY3VsYXRpbmcgdG90YWwgY2FzZXMgYW5kIGRlYXRocyBpbiBVU0ENCmBgYHtyfQ0KcjE2IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlVTQSIsIFllYXI9PTIwMTQpIA0KcjE3IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlVTQSIsIFllYXI9PTIwMTUpIA0KcjE4IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlVTQSIsIFllYXI9PTIwMTYpIA0KDQpkZWF0aHNfMjAxNF9VU0E8LSBzYXBwbHkoc2VsZWN0KHIxNix0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KZGVhdGhzXzIwMTVfVVNBPC0gc2FwcGx5KHNlbGVjdChyMTcsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyMTUsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCmRlYXRoc18yMDE2X1VTQSA8LSBzYXBwbHkoc2VsZWN0KHIxOCx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHIxNyx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KDQoNCg0KczE2IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiVVNBIiwgWWVhcj09MjAxNCkgDQpzMTcgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJVU0EiLCBZZWFyPT0yMDE1KSANCnMxOCA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlVTQSIsIFllYXI9PTIwMTYpIA0KDQpjYXNlc18yMDE0X1VTQTwtIHNhcHBseShzZWxlY3QoczE2LHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCkNCmNhc2VzXzIwMTVfVVNBPC0gc2FwcGx5KHNlbGVjdChzMTcsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMxNSx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE2X1VTQSA8LSBzYXBwbHkoc2VsZWN0KHMxOCx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QoczE3LHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCkNCg0KYGBgDQo3KUNhbGN1bGF0aW5nIHRvdGFsIGNhc2VzIGFuZCBkZWF0aHMgaW4gU3BhaW4NCmBgYHtyfQ0KcjE5IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNwYWluIiwgWWVhcj09MjAxNCkgDQpyMjAgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiU3BhaW4iLCBZZWFyPT0yMDE1KSANCnIyMSA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJTcGFpbiIsIFllYXI9PTIwMTYpIA0KDQpkZWF0aHNfMjAxNF9TcGFpbiA8LSBzYXBwbHkoc2VsZWN0KHIxOSx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KZGVhdGhzXzIwMTVfU3BhaW48LSBzYXBwbHkoc2VsZWN0KHIyMCx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHIxOSx0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KZGVhdGhzXzIwMTZfU3BhaW4gPC0gc2FwcGx5KHNlbGVjdChyMjEsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyMjAsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCg0KDQpzMTkgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJTcGFpbiIsIFllYXI9PTIwMTQpIA0KczIwIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiU3BhaW4iLCBZZWFyPT0yMDE1KSANCnMyMSA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlNwYWluIiwgWWVhcj09MjAxNikgDQoNCmNhc2VzXzIwMTRfU3BhaW4gPC0gc2FwcGx5KHNlbGVjdChzMTksdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNV9TcGFpbjwtIHNhcHBseShzZWxlY3QoczIwLHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChzMTksdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNl9TcGFpbiA8LSBzYXBwbHkoc2VsZWN0KHMyMSx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QoczIwLHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCkNCmBgYA0KOCkgY2FsY3VsYXRpbmcgdG90YWwgY2FzZXMgYW5kIGRlYXRocyBpbiBNYWxpDQpgYGB7cn0NCnIyMiA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJNYWxpIiwgWWVhcj09MjAxNCkgDQpyMjMgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiTWFsaSIsIFllYXI9PTIwMTUpIA0KcjI0IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIk1hbGkiLCBZZWFyPT0yMDE2KSANCg0KZGVhdGhzXzIwMTRfTWFsaSA8LSBzYXBwbHkoc2VsZWN0KHIyMix0b3RhbC5kZWF0aHMpLG5hLnJtPVQsbWF4KQ0KZGVhdGhzXzIwMTVfTWFsaTwtIHNhcHBseShzZWxlY3QocjIzLHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QocjIyLHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQpkZWF0aHNfMjAxNl9NYWxpIDwtIHNhcHBseShzZWxlY3QocjI0LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QocjIzLHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQoNCg0KczIyIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiTWFsaSIsIFllYXI9PTIwMTQpIA0KczIzIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiTWFsaSIsIFllYXI9PTIwMTUpIA0KczI0IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiTWFsaSIsIFllYXI9PTIwMTYpIA0KDQpjYXNlc18yMDE0X01hbGkgPC0gc2FwcGx5KHNlbGVjdChzMjIsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KY2FzZXNfMjAxNV9NYWxpPC0gc2FwcGx5KHNlbGVjdChzMjMsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMyMix0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE2X01hbGkgPC0gc2FwcGx5KHNlbGVjdChzMjQsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMyMyx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpgYGANCjkpIGNhbGN1bGF0aW5nIHRvdGFsIGNhc2VzIGFuZCBkZWF0aHMgaW4gVW5pdGVkIGtpbmdkb20NCmBgYHtyfQ0KcjI1IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlVuaXRlZCBLaW5nZG9tIiwgWWVhcj09MjAxNCkgDQpyMjYgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiVW5pdGVkIEtpbmdkb20iLCBZZWFyPT0yMDE1KSANCnIyNyA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJVbml0ZWQgS2luZ2RvbSIsIFllYXI9PTIwMTYpIA0KDQpkZWF0aHNfMjAxNF9Vbml0ZWRLaW5nZG9tIDwtIHNhcHBseShzZWxlY3QocjI1LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQpkZWF0aHNfMjAxNV9Vbml0ZWRLaW5nZG9tIDwtIHNhcHBseShzZWxlY3QocjI2LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QocjI1LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQpkZWF0aHNfMjAxNl9Vbml0ZWRLaW5nZG9tIDwtIHNhcHBseShzZWxlY3QocjI2LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QocjI2LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQoNCg0KDQpzMjUgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJVbml0ZWQgS2luZ2RvbSIsIFllYXI9PTIwMTQpIA0KczI2IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiVW5pdGVkIEtpbmdkb20iLCBZZWFyPT0yMDE1KSANCnMyNyA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIlVuaXRlZCBLaW5nZG9tIiwgWWVhcj09MjAxNikgDQoNCmNhc2VzXzIwMTRfVW5pdGVkS2luZ2RvbSA8LSBzYXBwbHkoc2VsZWN0KHMyNSx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE1X1VuaXRlZEtpbmdkb20gPC0gc2FwcGx5KHNlbGVjdChzMjYsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMyNSx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE2X1VuaXRlZEtpbmdkb20gPC0gc2FwcGx5KHNlbGVjdChzMjYsdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMyNix0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQoNCmBgYA0KMTApIGNhbGN1bGF0aW5nIHRvdGFsIGNhc2VzIGFuZCBkZWF0aHMgaW4gVW5pdGVkIGtpbmdkb208L2ZvbnQ+DQpgYGB7cn0NCnIyOCA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuZGVhdGhzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJJdGFseSIsIFllYXI9PTIwMTQpIA0KcjI5IDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5kZWF0aHMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkl0YWx5IiwgWWVhcj09MjAxNSkgDQpyMzAgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmRlYXRocyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiSXRhbHkiLCBZZWFyPT0yMDE2KSANCg0KZGVhdGhzXzIwMTRfSXRhbHkgPC0gc2FwcGx5KHNlbGVjdChyMjgsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCmRlYXRoc18yMDE1X0l0YWx5PC0gc2FwcGx5KHNlbGVjdChyMjksdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChyMjgsdG90YWwuZGVhdGhzKSxuYS5ybT1ULG1heCkNCmRlYXRoc18yMDE2X0l0YWx5IDwtIHNhcHBseShzZWxlY3QocjMwLHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpLXNhcHBseShzZWxlY3QocjI5LHRvdGFsLmRlYXRocyksbmEucm09VCxtYXgpDQoNCnMyOCA8LUVib2xhICU+JSBzZWxlY3QodG90YWwuY2FzZXMsQ291bnRyeSxZZWFyKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIkl0YWx5IiwgWWVhcj09MjAxNCkgDQpzMjkgPC1FYm9sYSAlPiUgc2VsZWN0KHRvdGFsLmNhc2VzLENvdW50cnksWWVhcikgJT4lIGZpbHRlcihDb3VudHJ5ID09ICJJdGFseSIsIFllYXI9PTIwMTUpIA0KczMwIDwtRWJvbGEgJT4lIHNlbGVjdCh0b3RhbC5jYXNlcyxDb3VudHJ5LFllYXIpICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiSXRhbHkiLCBZZWFyPT0yMDE2KSANCg0KY2FzZXNfMjAxNF9JdGFseSA8LSBzYXBwbHkoc2VsZWN0KHMyOCx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE1X0l0YWx5PC0gc2FwcGx5KHNlbGVjdChzMjksdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KS1zYXBwbHkoc2VsZWN0KHMyOCx0b3RhbC5jYXNlcyksbmEucm09VCxtYXgpDQpjYXNlc18yMDE2X0l0YWx5IDwtIHNhcHBseShzZWxlY3QoczMwLHRvdGFsLmNhc2VzKSxuYS5ybT1ULG1heCktc2FwcGx5KHNlbGVjdChzMjksdG90YWwuY2FzZXMpLG5hLnJtPVQsbWF4KQ0KDQpgYGANCjxmb250IHNpemUgPSAiNCI+IENyZWF0aW5nIGEgc2VwZXJhdGUgZGF0YWZyYW1lIGZvciBkZWF0aHMgaW4gZWFjaCB5ZWFyIDwvZm9udD4NCmBgYHtyfQ0KZGVhdGhzXzIwMTQgPC0gYyhkZWF0aHNfMjAxNF9HdWluZWEsZGVhdGhzXzIwMTRfTmlnZXJpYSxkZWF0aHNfMjAxNF9TaWVycmEsZGVhdGhzXzIwMTRfTGliZXJpYSxkZWF0aHNfMjAxNF9TZW5lZ2FsLGRlYXRoc18yMDE0X1VTQSwNCiAgICAgICAgICAgICAgICAgZGVhdGhzXzIwMTRfU3BhaW4sZGVhdGhzXzIwMTRfTWFsaSxkZWF0aHNfMjAxNF9Vbml0ZWRLaW5nZG9tICxkZWF0aHNfMjAxNF9JdGFseSAgICApDQoNCg0KZGVhdGhzXzIwMTUgPC0gYyhkZWF0aHNfMjAxNV9HdWluZWEsZGVhdGhzXzIwMTVfTmlnZXJpYSxkZWF0aHNfMjAxNV9TaWVycmEsZGVhdGhzXzIwMTVfTGliZXJpYSxkZWF0aHNfMjAxNV9TZW5lZ2FsLGRlYXRoc18yMDE1X1VTQSwNCiAgICAgICAgICAgICAgICAgZGVhdGhzXzIwMTVfU3BhaW4sZGVhdGhzXzIwMTVfTWFsaSxkZWF0aHNfMjAxNV9Vbml0ZWRLaW5nZG9tICxkZWF0aHNfMjAxNV9JdGFseSAgICApDQoNCg0KZGVhdGhzXzIwMTYgPC0gYyhkZWF0aHNfMjAxNl9HdWluZWEsZGVhdGhzXzIwMTZfTmlnZXJpYSxkZWF0aHNfMjAxNl9TaWVycmEsZGVhdGhzXzIwMTZfTGliZXJpYSxkZWF0aHNfMjAxNl9TZW5lZ2FsLGRlYXRoc18yMDE2X1VTQSwNCiAgICAgICAgICAgICAgICAgZGVhdGhzXzIwMTZfU3BhaW4sZGVhdGhzXzIwMTZfTWFsaSxkZWF0aHNfMjAxNl9Vbml0ZWRLaW5nZG9tLGRlYXRoc18yMDE2X0l0YWx5ICAgICkNCg0KZGVhdGguRWJvbGEgPC0gZGF0YS5mcmFtZShjb3VudHJ5X2xpc3QsZGVhdGhzXzIwMTQsZGVhdGhzXzIwMTUsZGVhdGhzXzIwMTYpDQpkZWF0aC5FYm9sYSA8LSBkby5jYWxsKGRhdGEuZnJhbWUsIGxhcHBseShkZWF0aC5FYm9sYSwgZnVuY3Rpb24oeCkge3JlcGxhY2UoeCwgaXMuaW5maW5pdGUoeCkgfCBpcy5uYSh4KSwgMCl9KSkNCg0KZGVhdGguRWJvbGENCmBgYA0KPGZvbnQgc2l6ZSA9ICI0Ij5DcmVhdGluZyBhIGRhdGFmcmFtZSBmb3IgY2FzZXMgaW4gZWFjaCB5ZWFyPC9mb250Pg0KYGBge3J9DQoNCmNhc2VzXzIwMTQgPC0gYyhjYXNlc18yMDE0X0d1aW5lYSxjYXNlc18yMDE0X05pZ2VyaWEsY2FzZXNfMjAxNF9TaWVycmEsY2FzZXNfMjAxNF9MaWJlcmlhLGNhc2VzXzIwMTRfU2VuZWdhbCxjYXNlc18yMDE0X1VTQSxjYXNlc18yMDE0X1NwYWluLA0KICAgICAgICAgICAgICAgICBjYXNlc18yMDE0X01hbGksY2FzZXNfMjAxNF9Vbml0ZWRLaW5nZG9tICxjYXNlc18yMDE0X0l0YWx5ICAgICkNCg0KDQpjYXNlc18yMDE1IDwtIGMoY2FzZXNfMjAxNV9HdWluZWEsY2FzZXNfMjAxNV9OaWdlcmlhLGNhc2VzXzIwMTVfU2llcnJhLGNhc2VzXzIwMTVfTGliZXJpYSxjYXNlc18yMDE1X1NlbmVnYWwsY2FzZXNfMjAxNV9VU0EsY2FzZXNfMjAxNV9TcGFpbiwNCiAgICAgICAgICAgICAgICAgY2FzZXNfMjAxNV9NYWxpLGNhc2VzXzIwMTVfVW5pdGVkS2luZ2RvbSAsY2FzZXNfMjAxNV9JdGFseSAgICApDQoNCg0KY2FzZXNfMjAxNiA8LSBjKGNhc2VzXzIwMTZfR3VpbmVhLGNhc2VzXzIwMTZfTmlnZXJpYSxjYXNlc18yMDE2X1NpZXJyYSxjYXNlc18yMDE2X0xpYmVyaWEsY2FzZXNfMjAxNl9TZW5lZ2FsLGNhc2VzXzIwMTZfVVNBLGNhc2VzXzIwMTZfU3BhaW4sDQogICAgICAgICAgICAgICAgIGNhc2VzXzIwMTZfTWFsaSxjYXNlc18yMDE2X1VuaXRlZEtpbmdkb20sY2FzZXNfMjAxNl9JdGFseSAgICApDQoNCg0KDQpjYXNlLkVib2xhIDwtIGRhdGEuZnJhbWUoY291bnRyeV9saXN0LGNhc2VzXzIwMTQsY2FzZXNfMjAxNSxjYXNlc18yMDE2KQ0KY2FzZS5FYm9sYSA8LSBkby5jYWxsKGRhdGEuZnJhbWUsIGxhcHBseShjYXNlLkVib2xhLCBmdW5jdGlvbih4KSB7cmVwbGFjZSh4LCBpcy5pbmZpbml0ZSh4KSB8IGlzLm5hKHgpLCAwKX0pKQ0KDQpjYXNlLkVib2xhDQoNCmNhc2UuRWJvbGEkY2FzZXNfMjAxNVtjYXNlLkVib2xhJGNhc2VzXzIwMTUgPT0tMl0gPC0gMA0KY2FzZS5FYm9sYSRjYXNlc18yMDE2W2Nhc2UuRWJvbGEkY2FzZXNfMjAxNiA9PS02XSA8LSAwDQpjYXNlLkVib2xhDQoNCg0KYGBgDQo8Zm9udCBzaXplID0gIiA1Ij4gUGxvdCBmb3IgdG90YWwgZGVhdGhzIGluIHllYXIgMjAxNDwvZm9udD4NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCnBsIDwtIGdncGxvdChkZWF0aC5FYm9sYSwgYWVzKHg9Q291bnRyeSwgeT1kZWF0aHNfMjAxNCkpDQoNCnBsMiA8LSBwbCtnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JyxmaWxsID0gJyNmYzAzNzMnLCBhbHBoYT0gMC45NSkNCg0KcGwzIDwtIHBsMiArIHhsYWIoJ0NvdW50cnknKSt5bGFiKCdObyBvZiBkZWF0aHMgaW4gMjAxNCAnKQ0KDQpwbDQ8LSBwbDMrZ2d0aXRsZSgiIE51bWJlciBvZiBkZWF0aHMgaW4geWVhciAyMDE0IGR1ZSB0byBvdXRicmVhayBvZiBFYm9sYSB2aXJ1cyIpDQoNCnByaW50KCBwbDQgKQ0KYGBgDQo8Zm9udCBzaXplID0gIiA1Ij4gUGxvdCBmb3IgdG90YWwgZGVhdGhzIGluIHllYXIgMjAxNTwvZm9udD4NCg0KYGBge3J9DQoNCnBsIDwtIGdncGxvdChkZWF0aC5FYm9sYSwgYWVzKHg9Q291bnRyeSwgeT1kZWF0aHNfMjAxNSkpDQoNCnBsMiA8LSBwbCtnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JyxmaWxsID0gJyNhM2NjMzEnLCBhbHBoYT0gMC45NSkNCg0KcGwzIDwtIHBsMiArIHhsYWIoJ0NvdW50cnknKSt5bGFiKCdObyBvZiBkZWF0aHMgJykNCg0KcGw0PC0gcGwzK2dndGl0bGUoIiBOdW1iZXIgb2YgZGVhdGhzIGluIHllYXIgMjAxNSBkdWUgdG8gb3V0YnJlYWsgb2YgRWJvbGEgdmlydXMiKQ0KDQpwcmludCggcGw0ICkNCmBgYA0KPGZvbnQgc2l6ZSA9ICIgNSI+UGxvdCBmb3IgdG90YWwgZGVhdGhzIGluIHllYXIgMjAxNTwvZm9udD4NCg0KPGZvbnQgc2l6ZSA9IjMiPiBTaW5jZSwgdGhlcmUgd2VyZSBubyBkZWF0aHMgcmVjb3JlZGVkIGluIDIwMTYsIG91ciBwbG90IHNob3dzIG5vdGhpbmcuPC9mb250Pg0KYGBge3J9DQpwbCA8LSBnZ3Bsb3QoZGVhdGguRWJvbGEsIGFlcyh4PUNvdW50cnksIHk9ZGVhdGhzXzIwMTYpKQ0KDQpwbDIgPC0gcGwrZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsZmlsbCA9ICcjY2MzMTRkJywgYWxwaGE9IDAuOTUpDQoNCnBsMyA8LSBwbDIgKyB4bGFiKCdDb3VudHJ5JykreWxhYignTm8gb2YgZGVhdGhzICcpDQoNCnBsNDwtIHBsMytnZ3RpdGxlKCIgTnVtYmVyIG9mIGRlYXRocyBpbiB5ZWFyIDIwMTYgZHVlIHRvIG91dGJyZWFrIG9mIEVib2xhIHZpcnVzIikNCg0KZ3BsPC0gZ2dwbG90bHkocGw0KQ0KDQpwcmludCggcGw0ICkNCg0KYGBgDQo8Zm9udCBzaXplID0gIiA1Ij5QbG90IGZvciBjYXNlcyBpbiAyMDE0PC9mb250Pg0KYGBge3J9DQoNCnBsIDwtIGdncGxvdChjYXNlLkVib2xhLCBhZXMoeD1Db3VudHJ5LCB5PWNhc2VzXzIwMTQpKQ0KDQpwbDIgPC0gcGwrZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsZmlsbD0nI2NjMzE0ZCcsYWxwaGE9IDAuOTUpDQoNCnBsMyA8LSBwbDIgKyB4bGFiKCdDb3VudHJ5JykreWxhYignTm8gb2YgQ2FzZXMgJykNCg0KcGw0PC0gcGwzK2dndGl0bGUoIiBOdW1iZXIgb2YgQ2FzZXMgaW4geWVhciAyMDE0IGR1ZSB0byBvdXRicmVhayBvZiBFYm9sYSB2aXJ1cyAiKQ0KDQpncGw8LSBnZ3Bsb3RseShwbDQpDQoNCnByaW50KCBwbDQgKQ0KYGBgDQoNCjxmb250IHNpemUgPSAiIDUiPlBsb3QgZm9yIGNhc2VzIGluIDIwMTU8L2ZvbnQ+DQpgYGB7cn0NCnBsIDwtIGdncGxvdChjYXNlLkVib2xhLCBhZXMoeD1Db3VudHJ5LCB5PWNhc2VzXzIwMTUpKQ0KDQpwbDIgPC0gcGwrZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsZmlsbD0nI2ZhMDJjZCcsYWxwaGE9IDAuOTUpDQoNCnBsMyA8LSBwbDIgKyB4bGFiKCdDb3VudHJ5JykreWxhYignTm8gb2YgQ2FzZXMgJykNCg0KcGw0PC0gcGwzK2dndGl0bGUoIiBOdW1iZXIgb2YgQ2FzZXMgaW4geWVhciAyMDE1IGR1ZSB0byBvdXRicmVhayBvZiBFYm9sYSB2aXJ1cyAiKQ0KDQpncGw8LSBnZ3Bsb3RseShwbDQpDQoNCnByaW50KCBwbDQgKQ0KYGBgDQo8Zm9udCBzaXplID0gIiA1Ij5QbG90IGZvciBjYXNlcyBpbiAyMDE2PC9mb250Pg0KDQo8Zm9udCBzaXplID0gIiAzIj4gU2luY2UsIG5vIGNhc2VzIHdlcmUgcmVjb3JkZWQgaW4gMjAxNiwgb3VyIHBsb3Qgc2hvd3Mgbm90aGluZzwvZm9udD4NCmBgYHtyfQ0KcGwgPC0gZ2dwbG90KGNhc2UuRWJvbGEsIGFlcyh4PUNvdW50cnksIHk9Y2FzZXNfMjAxNikpDQoNCnBsMiA8LSBwbCtnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JyxmaWxsPScjZmEwMmNkJyxhbHBoYT0gMC45NSkNCg0KcGwzIDwtIHBsMiArIHhsYWIoJ0NvdW50cnknKSt5bGFiKCdObyBvZiBDYXNlcyAnKQ0KDQpwbDQ8LSBwbDMrZ2d0aXRsZSgiIE51bWJlciBvZiBDYXNlcyBpbiB5ZWFyIDIwMTYgZHVlIHRvIG91dGJyZWFrIG9mIEVib2xhIHZpcnVzKDIwMTQtMjAxNikgIikNCg0KZ3BsPC0gZ2dwbG90bHkocGw0KQ0KDQpwcmludCggcGw0ICkNCmBgYA0KPGZvbnQgc2l6ZSA9ICIgNSI+UGxvdCBmb3Igc3VzcGVjdGVkIFZzIGNvbmZpcm1lZCBkZWF0aHMgZHVyaW5nIHRoZSBvdXRicmVhazwvZm9udD4NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQoNCnBsIDwtIGdncGxvdChFYm9sYSwgYWVzKHg9dG90YWwuZGVhdGhzLCB5PXRvdGFsLmNhc2VzICkpDQoNCnBsMiA8LSBwbCtnZW9tX3Ntb290aChtb2RlbD1sbSxjb2xvcj0iQmx1ZSIsIGZpbGw9IlJlZCIpDQpwbDMgPC0gcGwyICsgeGxhYignVG90YWwgZGVhdGhzJykreWxhYigiVG90YWwgY2FzZXMiKStnZ3RpdGxlKCJQbG90IGZvciB0b3RhbCBjYXNlcyB2cyB0b3RhbCBkZWF0aHMiKQ0KDQpncGw8LSBnZ3Bsb3RseShwbDMpDQpwcmludChwbDMpDQpgYGANCjxmb250IHNpemUgPSAiIDUiPlBsb3QgZm9yIHRvdGFsIGRlYXRocyBkdWUgRWJvbGEgdmlydXM8L2ZvbnQ+DQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KDQpwbCA8LSBnZ3Bsb3QoRWJvbGEsIGFlcyh5PXRvdGFsLmRlYXRocyx4PSBZZWFyKSkNCg0KcGwyIDwtIHBsK2dlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLGNvbG9yPSJyZWQiKSANCnBsMyA8LSBwbDIgKyB4bGFiKCdZZWFyJykreWxhYigiVG90YWwgZGVhdGhzIikrZ2d0aXRsZSgiUGxvdCBmb3IgIHRvdGFsIGRlYXRocyIpDQoNCmdwbDwtIGdncGxvdGx5KHBsMykNCnByaW50KGdwbCkNCmBgYA0KPGZvbnQgc2l6ZSA9ICIgNSI+UGxvdCBmb3IgdG90YWwgQ2FzZXM8L2ZvbnQ+DQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KDQpwbCA8LSBnZ3Bsb3QoRWJvbGEsIGFlcyh5PXRvdGFsLmNhc2VzLHg9IFllYXIpKQ0KDQpwbDIgPC0gcGwrZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsY29sb3I9InJlZCIpIA0KcGwzIDwtIHBsMiArIHhsYWIoJ1llYXInKSt5bGFiKCJUb3RhbCBjYXNlcyIpK2dndGl0bGUoIlBsb3QgZm9yICB0b3RhbCBjYXNlcyIpDQoNCmdwbDwtIGdncGxvdGx5KHBsMykNCnByaW50KHBsMykNCmBgYA0KDQoNCmBgYHtyfQ0KZGYuMjAxNCA8LSAgZGF0YS5mcmFtZShjb3VudHJ5X2xpc3QsY2FzZS5FYm9sYSRjYXNlc18yMDE0LGRlYXRoLkVib2xhJGRlYXRoc18yMDE0KQ0KZGYuMjAxNCA8LSBkby5jYWxsKGRhdGEuZnJhbWUsIGxhcHBseShkZi4yMDE0LCBmdW5jdGlvbih4KSB7cmVwbGFjZSh4LCBpcy5pbmZpbml0ZSh4KSB8IGlzLm5hKHgpLCAwKX0pKQ0KIGRmLjIwMTQNCg0KYGBgDQo8Zm9udCBzaXplID0gIiA1Ij5QaWUgY2hhcnQgZm9yIG1vcnRhbGl0eSByYXRlIGluIHllYXIgMjAxNDwvZm9udD4NCg0KYGBge3J9DQpkZWF0aC5wZXJjZW50YWdlLjIwMTQgPSBjKHN1bShkZi4yMDE0JGRlYXRoc18yMDE0KS9zdW0oZGYuMjAxNCRjYXNlc18yMDE0KSwgKHN1bShkZi4yMDE0JGNhc2VzXzIwMTQpIC0gc3VtKGRmLjIwMTQkZGVhdGhzXzIwMTQpKS9zdW0oZGYuMjAxNCRjYXNlc18yMDE0KSkNCmRlYXRoLnBlcmNlbnRhZ2UuMjAxNA0KYGBgDQpgYGB7cn0NCmxpYnJhcnkocGxvdHJpeCkNCkdyb3VwIDwtIGMoIkRlYXRoJSIsIlJlY29ydmVkJSIpDQoNCmxibHMgPC0gcGFzdGUwKEdyb3VwLCAiICIsIHJvdW5kKGRlYXRoLnBlcmNlbnRhZ2UuMjAxNCAvIHN1bShkZWF0aC5wZXJjZW50YWdlLjIwMTQpICogMTAwLCAxKSwgIiUiKQ0KcGllM0QoZGVhdGgucGVyY2VudGFnZS4yMDE0LGxhYmVscz1sYmxzLGV4cGxvZGU9MC4xLA0KICAgbWFpbj0iRGVhdGggVnMgUmVjb3J2ZXJkIGluIDIwMTQgIikNCmBgYA0KYGBge3J9DQpkZi4yMDE1IDwtICBkYXRhLmZyYW1lKGNvdW50cnlfbGlzdCxjYXNlLkVib2xhJGNhc2VzXzIwMTUsZGVhdGguRWJvbGEkZGVhdGhzXzIwMTUpDQpkZi4yMDE1IDwtIGRvLmNhbGwoZGF0YS5mcmFtZSwgbGFwcGx5KGRmLjIwMTUsIGZ1bmN0aW9uKHgpIHtyZXBsYWNlKHgsIGlzLmluZmluaXRlKHgpIHwgaXMubmEoeCksIDApfSkpDQogcHJpbnQoZGYuMjAxNSkNCiANCmBgYA0KYGBge3J9DQpkZWF0aC5wZXJjZW50YWdlLjIwMTUgPSBjKHN1bShkZi4yMDE1JGRlYXRoc18yMDE1KS9zdW0oZGYuMjAxNSRjYXNlc18yMDE1KSwgKHN1bShkZi4yMDE1JGNhc2VzXzIwMTUpIC0gc3VtKGRmLjIwMTUkZGVhdGhzXzIwMTUpKS9zdW0oZGYuMjAxNSRjYXNlc18yMDE1KSkNCnByaW50KGRlYXRoLnBlcmNlbnRhZ2UuMjAxNSkNCg0KYGBgDQo8Zm9udCBzaXplID0gIiA1Ij5QaWUgY2hhcnQgZm9yIG1vcnRhbGl0eSByYXRlIGluIHllYXIgMjAxNTwvZm9udD4NCmBgYHtyfQ0KbGlicmFyeShwbG90cml4KQ0KR3JvdXAgPC0gYygiRGVhdGglIiwiUmVjb3J2ZWQlIikNCg0KbGJscyA8LSBwYXN0ZTAoR3JvdXAsICIgIiwgcm91bmQoZGVhdGgucGVyY2VudGFnZS4yMDE1IC8gc3VtKGRlYXRoLnBlcmNlbnRhZ2UuMjAxNSkgKiAxMDAsIDEpLCAiJSIpDQpwaWUzRChkZWF0aC5wZXJjZW50YWdlLjIwMTUsbGFiZWxzPWxibHMsZXhwbG9kZT0wLjEsbWFpbj0iRGVhdGggVnMgUmVjb3J2ZXJkIGluIDIwMTUgIikNCmBgYA0KDQpgYGB7cn0NCmRmLjIwMTYgPC0gIGRhdGEuZnJhbWUoY291bnRyeV9saXN0LGNhc2UuRWJvbGEkY2FzZXNfMjAxNixkZWF0aC5FYm9sYSRkZWF0aHNfMjAxNikNCmRmLjIwMTYgPC0gZG8uY2FsbChkYXRhLmZyYW1lLCBsYXBwbHkoZGYuMjAxNiwgZnVuY3Rpb24oeCkge3JlcGxhY2UoeCwgaXMuaW5maW5pdGUoeCkgfCBpcy5uYSh4KSwgMCl9KSkNCiBwcmludChkZi4yMDE2KQ0KYGBgDQpgYGB7cn0NCmRlYXRoLnBlcmNlbnRhZ2UuMjAxNiA9IGMoc3VtKGRmLjIwMTYkZGVhdGhzXzIwMTYpL3N1bShkZi4yMDE2JGNhc2VzXzIwMTYpLCAoc3VtKGRmLjIwMTYkY2FzZXNfMjAxNikgLSBzdW0oZGYuMjAxNiRkZWF0aHNfMjAxNikpL3N1bShkZi4yMDE2JGNhc2VzXzIwMTYpKQ0KcHJpbnQoZGVhdGgucGVyY2VudGFnZS4yMDE2KQ0KDQpgYGANCjxmb250IHNpemUgPSAiIDUiPlBpZSBjaGFydCBmb3IgbW9ydGFsaXR5IHJhdGUgaW4geWVhciAyMDE2PC9mb250Pg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RyaXgpDQpsYmxzIDwtIGMoIlJlY29ydmVkIDEwMCUiKQ0KcGllM0QoZGVhdGgucGVyY2VudGFnZS4yMDE2LGxhYmVscz1sYmxzLG1haW49IkRlYXRoIFZzIFJlY29ydmVyZCBpbiAyMDE2ICIpDQpgYGANCmBgYHtyfQ0KZGVhdGgucGVyY2VudGFnZSA9IGMoc3VtKEVib2xhJHRvdGFsLmRlYXRocykvc3VtKEVib2xhJHRvdGFsLmNhc2VzKSwgKHN1bShFYm9sYSR0b3RhbC5jYXNlcykgLSBzdW0oRWJvbGEkdG90YWwuZGVhdGhzKSkvc3VtKEVib2xhJHRvdGFsLmNhc2VzKSkNCmRlYXRoLnBlcmNlbnRhZ2UNCmBgYA0KPGZvbnQgc2l6ZSA9ICIgNSI+UGllIGNoYXJ0IGZvciB0b3RhbCBtb3J0YWxpdHkgcmF0ZSBkdXJpbmcgdGhlIEVib2xhIE91dGJyZWFrKDIwMTQtIDIwMTYpPC9mb250Pg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RyaXgpDQpHcm91cCA8LSBjKCJEZWF0aCUiLCJSZWNvcnZlZCUiKQ0KDQpsYmxzIDwtIHBhc3RlMChHcm91cCwgIiAiLCByb3VuZChkZWF0aC5wZXJjZW50YWdlIC8gc3VtKGRlYXRoLnBlcmNlbnRhZ2UpICogMTAwLCAxKSwgIiUiKQ0KcGllM0QoZGVhdGgucGVyY2VudGFnZSxsYWJlbHM9bGJscyxleHBsb2RlPTAuMSxtYWluPSJEZWF0aCBWcyBSZWNvcnZlcmQgKDIwMTQsMjAxNSBhbmQgMjAxNikgIikNCmBgYA0KDQoNCg==